package com.itcam.treeutils;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.tree.Tree;
import cn.hutool.core.lang.tree.TreeNode;
import cn.hutool.core.lang.tree.TreeNodeConfig;
import cn.hutool.core.lang.tree.TreeUtil;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;

import java.util.List;


/**
 * @author : Cammy.Wu
 * Description : 
 */

@Slf4j
public class TreeUtilTest {
    public static void main(String[] args) {
        // 创建一个新的 TreeNode 列表，用于存储树节点信息
        List<TreeNode<String>> nodeList = CollUtil.newArrayList();

        // 向节点列表中添加节点信息，每个节点包含 ID、父节点 ID、节点名称和权重
        // 根节点 "系统管理"，ID 为 "1"，父节点 ID 为 "0"，权重为 5
        nodeList.add(new TreeNode<>("1", "0", "系统管理", 5));
        // "用户管理" 节点，ID 为 "11"，父节点 ID 为 "1"，权重为 222222
        nodeList.add(new TreeNode<>("11", "1", "用户管理", 222222));
        // "用户添加" 节点，ID 为 "111"，父节点 ID 为 "11"，权重为 0
        nodeList.add(new TreeNode<>("111", "11", "用户添加", 0));
        // 根节点 "店铺管理"，ID 为 "2"，父节点 ID 为 "0"，权重为 1
        nodeList.add(new TreeNode<>("2", "0", "店铺管理", 1));
        // "商品管理" 节点，ID 为 "21"，父节点 ID 为 "2"，权重为 44
        nodeList.add(new TreeNode<>("21", "2", "商品管理", 44));
        // "添加商品" 节点，ID 为 "221"，父节点 ID 为 "2"，权重为 2
        nodeList.add(new TreeNode<>("221", "2", "添加商品", 2));

        // 创建一个 TreeNode 配置对象，用于配置树节点的属性
        TreeNodeConfig treeNodeConfig = new TreeNodeConfig();
        // 设置权重字段的键名
        treeNodeConfig.setWeightKey("weight");
        // 设置 ID 字段的键名
        treeNodeConfig.setIdKey("id");
        // 设置树的最大深度
        treeNodeConfig.setDeep(3);

        // 使用 TreeUtil 工具类构建树结构
        // 第一个参数是节点列表，第二个参数是根节点的 ID
        // 第三个参数是一个 Lambda 表达式，用于将 TreeNode 转换为 Tree
        List<Tree<String>> treeNodes = TreeUtil.build(nodeList, "0",
                (treeNode, tree) -> {
                    // 设置树节点的 ID
                    tree.setId(treeNode.getId());
                    // 设置树节点的父节点 ID
                    tree.setParentId(treeNode.getParentId());
                    // 将 TreeNode 的属性复制到 Tree 中
                    tree.putAll(BeanUtil.beanToMap(treeNode));
                });

        // 使用日志记录器输出构建好的树结构，将树节点列表转换为 JSON 字符串
        log.info("treeNodes {}", JSONUtil.toJsonStr(treeNodes));

    }
}
